home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip: 2001 Haziran
/
CHIP Haziran2001.iso
/
prog
/
haziran
/
19
/
setup.exe
/
data.z
/
usb_diag.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2001-04-11
|
7KB
|
283 lines
// usb_diag.cpp - diagnostic sample for testing usb devices
//
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "../../include/windrvr.h"
#include "../shared/usb_diag_lib.h"
class UsbDiagSession
{
private:
char line[256];
WD_USB_DEVICE_REGISTER *m_pDev;
int GetPipeType(DWORD dwPipe);
public:
HANDLE m_hWD;
UsbDiagSession();
int MainMenu();
virtual ~UsbDiagSession();
void DoReadWrite();
void DoResetPipe();
void DoCloseDevice();
void DoOpenDevice();
void DoDisplayPipesInfo();
void DoResetDevice();
BOOL Init();
void CloseWindriver();
};
int UsbDiagSession::GetPipeType(DWORD dwPipe)
{
if(!m_pDev || !m_pDev->hDevice)
return -1;
for (DWORD i=0; i<m_pDev->Device.dwPipes; i++)
{
WD_USB_PIPE_INFO *pPipe = &m_pDev->Device.Pipe[i];
if (pPipe->dwNumber==dwPipe && pPipe->type>=0 && pPipe->type<3)
return pPipe->type;
}
return -1;
}
UsbDiagSession::UsbDiagSession()
{
m_hWD = INVALID_HANDLE_VALUE;
m_pDev = NULL;
}
UsbDiagSession::~UsbDiagSession()
{
DoCloseDevice();
CloseWindriver();
};
void UsbDiagSession::DoResetDevice()
{
if(!m_pDev || !m_pDev->hDevice)
return;
WD_UsbResetDevice(m_hWD, m_pDev->hDevice);
}
void UsbDiagSession::DoCloseDevice()
{
if(!m_pDev || !m_pDev->hDevice)
return;
WD_UsbDeviceUnregister(m_hWD, m_pDev);
free (m_pDev);
m_pDev = NULL;
printf("Device closed successfully\n");
}
void UsbDiagSession::CloseWindriver()
{
if(m_hWD == INVALID_HANDLE_VALUE)
return;
WD_Close(m_hWD);
m_hWD = INVALID_HANDLE_VALUE;
}
BOOL UsbDiagSession::Init()
{
m_hWD = WD_Open();
return (m_hWD != INVALID_HANDLE_VALUE);
}
void UsbDiagSession::DoOpenDevice()
{
if(m_pDev && m_pDev->hDevice)
{
printf("Device already open ! \n");
return;
}
if (!m_pDev)
m_pDev = (WD_USB_DEVICE_REGISTER *) malloc(sizeof(WD_USB_DEVICE_REGISTER));
BZERO(*m_pDev);
printf ("Please enter physical address, configuration and interface data:\n");
printf ("------------------------------------\n");
printf ("Enter unique ID of the device: ");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d",&m_pDev->uniqueId);
printf ("Enter configuration index: ");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d",&m_pDev->dwConfigurationIndex);
printf ("Enter interface number: ");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d",&m_pDev->dwInterfaceNum);
printf ("Enter alternate setting of the interface : ");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d",&m_pDev->dwInterfaceAlternate);
WD_UsbDeviceRegister(m_hWD, m_pDev);
if (!m_pDev->hDevice)
{
printf("Failed registring the device\n");
free (m_pDev);
m_pDev = NULL;
return;
}
DoDisplayPipesInfo();
}
void UsbDiagSession::DoDisplayPipesInfo()
{
printf("device has %d pipes:\n", m_pDev->Device.dwPipes);
for (DWORD i=0; i<m_pDev->Device.dwPipes; i++)
{
WD_USB_PIPE_INFO *pPipe = &m_pDev->Device.Pipe[i];
PCHAR pipeType[] ={"Control", "Isochronous", "Bulk", "Interrupt"};
if (pPipe->type>3)
printf("recived wrong pipe type (0x%x)\n", pPipe->type);
printf("pipe no. %02x - type: %s\n", pPipe->dwNumber, pipeType[pPipe->type]);
printf(" max packet size: %d, direction: %s, interval: %d\n",
pPipe->dwMaximumPacketSize,
pPipe->direction==USB_DIR_IN ? "In" : pPipe->direction==USB_DIR_OUT ? "Out" : "In & Out",
pPipe->dwInterval);
}
}
void UsbDiagSession::DoReadWrite()
{
WD_USB_TRANSFER transfer;
BZERO(transfer);
BOOL fStatus = 0;
if(!m_pDev || !m_pDev->hDevice)
return;
transfer.hDevice = m_pDev->hDevice;
printf("Enter pipe number:");
fgets(line, sizeof(line), stdin);
sscanf(line, "%x",&transfer.dwPipe);
printf("Enter direction of data (0-OUT , 1-IN): ");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d",&transfer.fRead);
if (GetPipeType(transfer.dwPipe)==0) // control pipe
{
printf("Enter setup packet (8 bytes)\n");
GetHexBuffer((PVOID)transfer.SetupPacket, 8);
transfer.dwBytes = transfer.SetupPacket[6] + (transfer.SetupPacket[7]<<8);
}
else
{
printf("Enter buffer size to %s:" , transfer.fRead ? "read" : "write");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", &transfer.dwBytes);
}
transfer.pBuffer = malloc (transfer.dwBytes);
if(!transfer.pBuffer)
{
printf("Failed to allocate buffer\n");
return;
}
printf("Enter wait time in kernel in milli-seconds (0 for infinite):");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", &transfer.dwTimeout);
if(!transfer.fRead)
{
printf("Enter data :");
GetHexBuffer(transfer.pBuffer, transfer.dwBytes);
}
WD_UsbTransfer(m_hWD, &transfer);
if (transfer.fOK)
printf("transfer successful\n");
else
printf("error on transfer\n");
if(transfer.fRead && transfer.dwBytesTransfered)
PrintHexBuffer(transfer.pBuffer, transfer.dwBytesTransfered);
printf("Bytes transferred = %d\n", transfer.dwBytesTransfered);
free(transfer.pBuffer);
return;
}
void UsbDiagSession::DoResetPipe()
{
WD_USB_RESET_PIPE resetPipe;
BZERO(resetPipe);
if(!m_pDev || !m_pDev->hDevice)
return;
resetPipe.hDevice = m_pDev->hDevice;
printf("Enter pipe number:");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d",&resetPipe.dwPipe);
WD_UsbResetPipe(m_hWD, &resetPipe);
}
int UsbDiagSession::MainMenu()
{
int cmd = 0;
char line[100];
printf("\n");
printf("--------- " WD_PROD_NAME " USB Diagnostic ------------ \n");
printf("--------- Main Menu ---------\n");
printf("(1) - Scan for USB Devices\n");
printf("(2) - Get device configurations\n");
if (!m_pDev || !m_pDev->hDevice)
printf("(3) - Open device \n");
else
{
printf("(4) - Display pipes info\n");
printf("(5) - Reset USB Device and Port\n");
printf("(6) - Reset Pipe \n");
printf("(7) - Read\\write from pipe\n");
printf("(8) - Close USB Device\n");
}
printf("(99) - Exit\n");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d",&cmd);
return cmd;
}
int _cdecl main(int argc, char *argv[])
{
UsbDiagSession session;
if(!session.Init())
return 0;
while (1)
{
switch (session.MainMenu())
{
case 1:
USB_Print_all_devices_info();
break;
case 2:
USB_Print_device_Configurations();
break;
case 3:
session.DoOpenDevice();
break;
case 4:
session.DoDisplayPipesInfo();
break;
case 5:
session.DoResetDevice();
break;
case 6:
session.DoResetPipe();
break;
case 7:
session.DoReadWrite();
break;
case 8:
session.DoCloseDevice();
break;
case 99:
return 0;
}
}
return 0;
}